在标准Java API中,是否存在==
将返回true
但equals
将返回的任何方案false
.理论上,这可以写入用户定义的类,而非常像这样
class A { public boolean equals(Object o) { return this != o; } }
是否有在示例,其中一些对象的任何实际烤b
和c
,b == c
将返回true
,但b.equals(c)
回报false
?此外,有这样的行为会有任何可能的好处吗?
没有*.
合同equals
有5个规则,第一个涵盖了这个案例:
equals方法在非null对象引用上实现等价关系:
它是自反的:对于任何非空引用值x,x.equals(x)应该返回true.
它是对称的:对于任何非空引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true.
它是传递性的:对于任何非空引用值x,y和z,如果x.equals(y)返回true而y.equals(z)返回true,则x.equals(z)应返回true.
它是一致的:对于任何非空引用值x和y,x.equals(y)的多次调用始终返回true或始终返回false,前提是不修改在对象的equals比较中使用的信息.
对于任何非空引用值x,x.equals(null)应返回false.
Java标准库中违反自反性的任何对象都是错误,如果您确实在API中发现了这样的对象,请将其报告给Oracle.
*第三方图书馆可以说较少.开发人员犯错误或对equals
合同一无所知.通常,这也可以作为第三方库中的错误,但是YMMV.